package command

import (
    "time"
    "{{.Namespace}}/pkg/cmd-service/domain/{{.aggregate_name}}/event"
    "{{.Namespace}}/pkg/cmd-service/domain/{{.aggregate_name}}/field"
    "github.com/liuxd6825/dapr-go-ddd-sdk/ddd"
)

//
// {{.ClassName}}
// @Description: {{.Description}}
//
type {{.ClassName}} struct {
	CommandId   string    `json:"commandId" validate:"required" description:"命令ID"`   // 命令ID
	IsValidOnly bool      `json:"isValidOnly" validate:"-"  description:"是否仅验证，不执行命令"`  // 是否仅验证，不执行命令
    {{- if .IsUpdate }}
	UpdateMask  []string  `json:"updateMask" validate:"-"  description:"要更新的字段项，空值：更新所有字段"`  // 要更新的字段项，空值：更新所有字段
    {{- end }}
{{- range $name, $property := .Properties}}
    {{$property.UpperName}} {{if $property.IsData }} {{end}} {{$property.GoLanType}} `json:"{{$property.LowerName}}" validate:"{{$property.GetValidate}}" description:"{{$property.Description}}"`  // {{$property.Description}}
{{- end}}
}

//
// {{.Name}}Metadata
// @Description:  {{.Description}} 元数据
//
type {{.ClassName}}Metadata struct {
	CommandId   metadata.Property `json:"-"`
	IsValidOnly metadata.Property `json:"-"`
    {{- if .IsUpdate }}
	UpdateMask  metadata.Property `json:"-"`
    {{- end }}
{{- range $name, $property := .Properties }}
    {{$property.UpperName}}  metadata.Property `json:"-"`
{{- end }}
	Properties  metadata.Properties `json:"properties"`
}

var (
    // 元数据
    _{{.className}}Metadata = new{{.ClassName}}Metadata()
)

//
// new{{.ClassName}}Metadata
// @Description: 新建{{.Description}}元数据
// @return *{{.ClassName}}Metadata
//
func new{{.ClassName}}Metadata() *{{.ClassName}}Metadata {
	v := &{{.ClassName}}{}
	m := &{{.ClassName}}Metadata{}
    if err := metadata.InitMetadata(m, v); err != nil {
        panic(err)
    }
	return m
}

//
// Get{{.ClassName}}Metadata
// @Description: 获取{{.Description}}元数据
// @return *{{.ClassName}}Metadata
//
func Get{{.ClassName}}Metadata() *{{.Name}}Metadata {
    return _{{.className}}Metadata
}

//
// GetAggregateId
// @Description: 获取聚合根Id
//
func (c *{{.ClassName}}) GetAggregateId() ddd.AggregateId {
    return ddd.NewAggregateId(c.{{.AggregateId}})
}

//
// GetCommandId
// @Description: 获取命令Id
//
func (c *{{.ClassName}}) GetCommandId() string {
    return c.CommandId
}

//
// GetTenantId
// @Description: 获取租户Id
//
func (c *{{.ClassName}}) GetTenantId() string {
    return c.Data.TenantId
}

//
// GetIsValidOnly
// @Description: 是否只验证不执行。
//
func (c *{{.ClassName}}) GetIsValidOnly() bool {
	return c.IsValidOnly
}

{{- if .IsAggregateCreateCommand }}
//
// IsAggregateCreateCommand
// @Description: 标识此命令为是聚合根创建命令，DDD框架层使用。
//
func (c *{{.ClassName}}) IsAggregateCreateCommand() {

}

{{- end }}
//
// Validate
// @Description: 命令数据验证
//
func (c *{{.ClassName}}) Validate() error {
	ve := ddd.ValidateCommand(c, nil)
    /* 添加其他数据检查
    if c.Data.Id == "" {
        ve.AppendField("data.id", "不能为空")
    }
    */
	return ve.GetError()
}

